 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;


import client.modele.InterfaceProtocoleClient;
import client.modele.ProtocoleClient;
import client.modele.InterfaceModele;
import client.controleur.ApplicationControler;
import java.util.Locale;
import java.util.ResourceBundle;
import librairie.InterfaceTransport;
import librairie.Transport;
import client.vue.VueCalculPret;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 *
 * @author KB
 */
public class MainClient {

    public static final int PORT = 1234;

    public static void main(String[] argv) {
        //Instanciation de la vue
        VueCalculPret vue = new VueCalculPret(Locale.FRANCE);

        //Instanciation du modele
        InterfaceModele modeleCalculPret = null;
        try{
            String model = ResourceBundle.getBundle("client.modele.config").getString("model");

            Class classe = Class.forName(model);
            
            //Si le modèle est le 
            if(classe.getName().equals("client.modele.ApplicationClient")){
                InterfaceTransport transport = new Transport(argv[0], PORT);
                InterfaceProtocoleClient protocole = new ProtocoleClient(transport);
                Constructor c = classe.getConstructor(new Class[]{InterfaceProtocoleClient.class});
                //On passe le protocole au modèle
                modeleCalculPret = (InterfaceModele) c.newInstance(new Object[]{protocole});
            }else{
                modeleCalculPret = (InterfaceModele) classe.newInstance();
            }
            
        } catch (ClassNotFoundException e) {
            System.err.println("Modèle non trouvé");
            System.exit(1);
        } catch (InstantiationException e) {
            System.err.println("Impossible de créer une nouvelle instance");
            System.exit(2);
        } catch (IllegalAccessException e) {
            System.err.println("Impossible d'acceder au modèle");
            System.exit(3);
        }catch (NoSuchMethodException ne){
            System.err.println("Méthode introuvable");
        }catch (InvocationTargetException ie){
            System.err.println("Le fichier de modèle spécifié dans config.properties est introuvable");
        }
        
        //Liaison du controleur avec la vue et le modele
        ApplicationControler controleur = new ApplicationControler(vue, modeleCalculPret);

        //On abonne la vue à l'Observer qu'est le controller
        vue.abonnementComponents(controleur);

        //Lancement de l'éxecution du programme
        controleur.execute();

    }
  }
